package br.com.werp.regras.acesso.controle;

import br.com.werp.regras.acesso.integracao.FabricaDAO;
import br.com.werp.regras.acesso.integracao.SetorDAO;
import br.com.werp.regras.acesso.integracao.SetorEmpresaDAO;
import br.com.werp.regras.geral.Auditoria;
import br.com.werp.regras.geral.FabricaSubSistema;
import br.com.werp.regras.geral.util.BeanUtil;
import br.com.werp.regras.geral.util.Util;
import br.com.werp.regras.geral.vos.acesso.SetorEmpresaVO;
import br.com.werp.regras.geral.vos.tabelas.Setor;

import java.util.Collections;
import java.util.Comparator;
import java.util.List;


/**
 * @author Sobreira
 * Criado em 08/11/2005
 */
public class ControleSetor {
    public List pesquisarSetorEmpresa(Object form) throws Exception {
        SetorEmpresaVO setorEmpresaVO = new SetorEmpresaVO();
        BeanUtil.copiarVOStringTipo(form, setorEmpresaVO);

        SetorEmpresaDAO setorempresaDAO = FabricaDAO.getSetorEmpresaDAO();

        List setores = setorempresaDAO.pesquisarSetorEmpresa(setorEmpresaVO);

        Collections.sort(setores,
            new Comparator() {
                public int compare(Object o1, Object o2) {
                    SetorEmpresaVO setor1 = (SetorEmpresaVO) o1;
                    SetorEmpresaVO setor2 = (SetorEmpresaVO) o2;

                    return setor1.getStor_descricao()
                                 .compareTo(setor2.getStor_descricao());
                }
            });

        return setores;
    }

    public void salvarSetor(Object form, String usuario)
        throws Exception {
        Setor setor = new Setor();

        SetorDAO setorDAO = FabricaDAO.getSetorDAO();

        BeanUtil.copiarVOStringTipo(form, setor);

        Auditoria auditoria = FabricaSubSistema.getAuditoria();

        Object key = setorDAO.iniciarTransacao();

        try {
            if (setor.getStor_id() == 0) {
                setorDAO.salvarSetor(setor, key);
                auditoria.auditarRecurso(key, usuario, setor, Auditoria.INCLUIR);
            } else {
                setorDAO.atualizarSetor(setor, key);
                auditoria.auditarRecurso(key, usuario, setor, Auditoria.ALTERAR);
            }

            setorDAO.concluirTransacao(key);
        } catch (Exception e) {
            setorDAO.abortarTransacao(key);
            throw e;
        }
    }

    public void excluirSetor(Object form, String usuario)
        throws Exception {
        Setor setor = new Setor();

        SetorDAO setorDAO = FabricaDAO.getSetorDAO();

        BeanUtil.copiarVOStringTipo(form, setor);

        Auditoria auditoria = FabricaSubSistema.getAuditoria();

        Object key = setorDAO.iniciarTransacao();

        try {
            setorDAO.excluirSetor(setor, key);
            auditoria.auditarRecurso(key, usuario, setor, Auditoria.EXCLUIR);
            setorDAO.concluirTransacao(key);
        } catch (Exception e) {
            setorDAO.abortarTransacao(key);
            throw e;
        }
    }

    public List pesquisarSetor(Object form) throws Exception {
        Setor setor = new Setor();

        BeanUtil.copiarVOStringTipo(form, setor);

        SetorDAO setorDAO = FabricaDAO.getSetorDAO();

        return setorDAO.pesquisarSetor(setor);
    }

    public void carregarSetor(Object form) throws Exception {
        Setor setor = (Setor) Util.get0(pesquisarSetor(form));

        BeanUtil.copiarVOTipoString(setor, form);
    }
}
